package com.cskaoyan.javase.oop3._2inner._4local._2usecase;

/**
 * 局部内部类在开发中多用于以下场景:
 * 主要是配合方法使用
 *      1.在方法的返回值需要返回一个对象时
 *          利用局部内部类去继承某个类,接口(还可以重写方法),返回该类/接口的子类对象
 *
 *      2.在方法调用时需要传入一个对象时
 *          利用局部内部类去继承某个类,接口(还可以重写方法),传入方法该类/接口的子类对象
 *
 * 思考:
 * 局部内部类仅在作用域内部生效,外界是无法直接访问的
 * 但是外界有没有可能操作局部内部类对象呢?
 *
 * @since 14:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(new IAImpl());
        class IAImplLocal implements IA {
        }
        test(new IAImplLocal());


        // a引用指向的对象,就是局部内部类的对象,这是父类引用指向子类对象
        BaseA a = test();
        a.method();
        // a.testInner();
    }

    public static void test(IA ia) {
    }

    public static BaseA test() {
        // return new BaseASon();
        // 这里需要返回一个BaseA的子类对象,但是这个子类不需要外界访问,那么可以使用局部内部类
        class BaseASonLocal extends BaseA {
            @Override
            public void method() {
                System.out.println("hello world!");
            }

            // 子类扩展父类,子类新增的属于自身的成员方法
            public void testInner(){}
        }
        return new BaseASonLocal();
    }
}

abstract class BaseA {
    public abstract void method();
}

interface IA {
}

class BaseASon extends BaseA {
    @Override
    public void method() {
        System.out.println("666666666666!");
    }
}

class IAImpl implements IA {
}